/*
 * @Author: zhaoxiangyu@
 * @Date: 2021-11-05 10:31:46
 * @LastEditors: 647355931@qq.com
 * @LastEditTime: 2021-11-05 17:41:16
 * @Description: file content
 */
import Dep from "./dep.js";
import defineReactive from "./defineReactive.js";
import observe from "./observe.js";
import protoAgument from "./protoAraument.js";

export default function Observer(value) {
  // 接受一个数据 对象 数组
  // 将里面的每一项都设置defineReactive拦截
  // 响应式更新 前面一层是key：value
  // 如果有key:{a:1} 就需要对第二层甚至更深做出依赖收集
  //   const new Dep()
  //  给每一个value数据都添加一个 __ob__ 属性  用于记录
  Object.defineProperty(value, "__ob__", {
    value: this,
    enumerable: false,
    writable: true,
    configurable: true,
  });
  // 对值进行依赖收集
  value.__ob__.dep = new Dep();

  if (Array.isArray(value)) {
    // debugger
    protoAgument(value);
    //设置数组响应式
    this.observerArray(value);
  } else {
    // 设置对象响应式
    this.walk(value);
  }
}

Observer.prototype.walk = function (obj) {
  for (let key in obj) {
    // 依次给对象设置拦截
    defineReactive(obj, key, obj[key]);
  }
};

// 处理数组中元素为非原始值得情况  让元素也具有响应式得能力
// 例如  [1,2,{key: 'value'}]   所以要调用observe去判断各种情况
Observer.prototype.observerArray = function (arr) {
  for (const iterator of arr) {
    observe(iterator);
  }
};

// export default Observer;
